跳到主要内容

03 关键帧:基本概念

阅读量

0

阅读人次

0

任何视频内容都由一系列帧(Frame)组成。 通常表示为 FPS(每秒帧数,Frames Per Second),每一帧都是静止图像,当按顺序播放时会创建运动图像。 30 FPS 的内容意味着视频的每一秒将播放 30 个“静止图像”。 在视频压缩领域中,可以通过多种不同方式压缩帧,具体取决于所使用的算法。视频帧的不同算法一般称之为图片类型(picture types)或者帧类型(frame types)

一些最先进的编解码器使用 3 种帧类型或图片类型,即:

  • I帧:存储整个图片的帧
  • P帧:只存储当前图片和上一张图片之间变化的帧
  • B帧:存储与该帧前后图片差异的帧

这 3 种帧类型形成一组图片(或 GOP)。

I-Frame:intraframe 的缩写,MPEG 标准使用的一种视频压缩方法。 在一个运动序列中,将单独的图片帧组合在一起,形成上述 GOP,并进行回放,以便记录视频内容的连续变化。

I 帧,也称为关键帧,是数字内容的单帧,压缩器独立于其前后的帧进行压缩编码,并存储显示该帧所需的所有数据。

通常,I 帧与 P 帧和 B 帧散布在压缩视频中。

包含的 I 帧越多,视频的质量就越好。 但是,I 帧所包含的信息最多,因此占用了存储介质空间也会更大。

P-Frame:预测帧(Predictive Frame)或预测帧(Predicted Frame)的缩写。 它在 I 帧之后,仅包含与前一个 I 帧相比发生变化的数据,例如颜色或内容变化。 因此,P 帧依赖于 I 帧来填充大部分数据。

B-Frame:双向帧(Bi-directional Frame)或双向预测帧(Bidirectional Predictive Frame)的缩写。 顾名思义,B 帧依赖于它的前后两帧。 B 帧仅包含与前后两帧发生变化的数据。

图片组(Group of Pictures):一组图片或GOP结构,指定 I 帧、B 帧和 P 帧的排列顺序。

如何设置关键帧间隔以及为什么?

假设您需要以 25FPS 的速度流式传输文件,使用 h264 编解码器,比较好的选择是使用以下命令指定 2 秒的关键帧间隔:

ffmpeg -i YOUR_INPUT -c:v h264 -keyint_min 25 -g 50 -sc_threshold 0 OUTPUT.mp4

-i:输入文件

-c:v h264:指定h264为视频编解码器

-key_int_min:设置关键钥帧的最小间隔。 在此示例中,最小关键帧间隔为25。

-g 50:此选项代表Group of Pictures,并指示 FFMPEG最大关键帧间隔为50帧。假设您的输入源以 25 FPS 运行,那么就是每2秒一个关键帧。

-sc_threshold 0:这个“SC”代表场景变化。 FFmpeg 默认的关键帧间隔为 250 帧,并在场景变化时插入关键帧,即图片内容发生变化时。 此选项将确保不会在场景更改时添加新的关键帧。

之所以短间隔的关键帧非常重要,是因为我们需要在播放或寻找(快进或快退)视频时为用户提供快速体验,尤其是在自适应比特率情况下,终端用户会根据可用带宽自动接收最高或最低质量的视频。播放器无法在 p 帧或 b 帧上开始播放。

如何检查视频的关键帧间隔?

FFPROBE 从多媒体流中读取信息并打印,使用 FFPROBE 检查关键帧间隔:

ffprobe -loglevel error -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0 YOUR_FILE.mp4

该命令将以秒为单位列出每个 I 帧(关键帧)的确切时间,跳过 P 帧和 B 帧。